
package ija.model.figures;

import java.util.List;

import ija.model.basis.Position;
import ija.model.types.Color;

/**
 * Třída reprezentuje dámu.
 * 
 * @author Radek Necas, xnecas18
 */
public class Queen extends CheckersFigure{
   
    /**
     * Konstruktor vytváří dámu.
     * Vytváří všechna potřebná propojení (pozici bude přidána figurka).
     * 
     * @param p pozice na které bude dáma vytvořena.
     * @param c barva dámy.
     */
    public Queen(Position p, Color c) {
        super(p, c);
    }
    
    /**
     * Test zda je povolen pohyb na danou pozici.
     * Dáma se může pohybovat po diagonále libovolným směrem o libovolný počet pozic.
     * 
     * @param p cílová pozice pohybu. Nemusí být součástí téže šachovnice.
     * @return při splnění testu true, jinak false.
     */
    @Override
    public boolean canMove(Position p) {
        if(p.getFigure() != null || !position.sameDiagonal(p))
            return false;
        
        int rowIncrement = getRowIncrement(p);
        int columnIncrement = getColumnIncrement(p);
        int dC = 0, dR = 0;
        Position actPosition;
        do {
            dC += columnIncrement;
            dR += rowIncrement;
            actPosition = position.nextPosition(dC, dR);
            if(actPosition.getFigure() != null)
                return false;
        } while(!actPosition.equals(p));
        
        return true;
    }

    /**
     * Test zda může být proveden skok na danou pozici.
     * Skákat se může pouze o libovolný počet pozic po diagonále.
     * Mezi aktuální pozicí a přeskakovaným pěšce a přeskakovaným pěšcem a cílovou pozicí může být libovolný počet míst.
     * Mezi aktuální a cílovou pozicí musí být pěšec soupeře.
     * Test splní pouze jednoduchý skok. Víceskoky se musí reprezentovat opakovaným voláním.
     * 
     * @param endPosition cílová pozice skoku.
     * @return pozici figurky, jenž je přeskočena (po skoku by měla být odstraněna). Při neúspěchu null.
     */
    @Override
    public Position canJump(Position endPosition) {
        if(!position.sameDiagonal(endPosition) || endPosition.getFigure() != null)
            return null;
        
        int rowIncrement = getRowIncrement(endPosition);
        int columnIncrement = getColumnIncrement(endPosition);
        int dC = 0, dR = 0;
        Position jumpedPosition;
        
        do {        // Hledam v diagonale od soucasne pozice do cilove pozice skoku figurku
            dC += columnIncrement;
            dR += rowIncrement;
            jumpedPosition = position.nextPosition(dC, dR);
            // Pokud dojdu do cile skoku a figurku jsem nenalezl nelze skocit
            if(jumpedPosition.equals(endPosition))
                return null;
        } while(jumpedPosition.getFigure() == null);
        
        // Pokud ma figurka, kterou chci preskocit stejnou barvu jako moje nelze skakat
        if(jumpedPosition.getFigure().getColor() == color)
            return null;
        
        Position stopPosition;
        do {    // Od nalezene figurky do ciloveho pole skoku musi byt prazdno
            dC += columnIncrement;
            dR += rowIncrement;
            stopPosition = position.nextPosition(dC, dR);
            if(stopPosition.getFigure() != null)
                return null;
        } while(!stopPosition.equals(endPosition));
        
        return jumpedPosition;
    }
    
    
    ////////////////////////////////////////////////////////////////
    // -----------  Soukrome metody ------------------------------//
    ////////////////////////////////////////////////////////////////
    
    
    private int getRowIncrement(Position endPosition) {
        if(endPosition.getRowNumber() - position.getRowNumber() > 0)
            return 1;
        else
            return -1;
    }
    
    private int getColumnIncrement(Position endPosition) {
        if(endPosition.getColumnChar() - position.getColumnChar() > 0)
            return 1;
        else
            return -1;
    }

	@Override
	public boolean getMoves(List<String> list, boolean jumpsonly) {
		// TODO Auto-generated method stub
		return false;
	}	
	
	

	@Override
	public boolean inDirection(Position p) {
		// TODO Auto-generated method stub
		return false;
	}
}
